package com.xiaoyilin.ack;

import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

/**
 * 消息发送到交换机确认机制
 * message 从 producer 到 rabbitmq broker cluster 则会返回一个 confirmCallback
 * confrim 模式只能保证消息到达 broker，不能保证消息准确投递到目标 queue 里。
 * 在有些业务场景下，我们需要保证消息一定要投递到目标 queue 里，此时就需要用到 return 退回模式。
 */
@Component
public class RabbitConfirmCallback implements RabbitTemplate.ConfirmCallback {


    /**
     * 当消息发送到交换机（exchange）时，该方法被调用.
     * 1.如果消息没有到exchange,则 ack=false
     * 2.如果消息到达exchange,则 ack=true
     *
     * @param correlationData
     * @param ack
     * @param cause
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        System.out.println("(start)=========================生产者");
        System.out.println("ack:" + ack);
        System.out.println("cause:" + cause);
        if (ack) {
            System.out.println("消息到达Rabbitmq Exchange");
            System.out.println(correlationData.getId());
        } else {
            System.out.println(cause);
        }
        System.out.println("(end)=========================生产者");
    }

}
